#include <iostream>

#include <pthread.h>
#include <string.h>
#include <unistd.h>

__thread int gval = 100;
void *func(void *args)
{
    while (true)
    {
        sleep(1);
        std::cout << "new线程,&gval:"<< &gval << ",查看gval:" << gval << std::endl;
    }
    return nullptr;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, func, (void *)"thread-1");

    while(true)
    {
        sleep(2);
        gval += 10;
        std::cout <<"main线程,&gval:"<< &gval << ",修改,gval:" << gval << std::endl;
    }
    return 0;
}

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,func,(void*)"thread-1");

//     sleep(3);
//     pthread_cancel(tid);
//     void* retval = nullptr;
//     pthread_join(tid,&retval);

//     std::cout << "retvat: " << (long long int)retval << std::endl;
//     return 0;
// }

// void* func(void* args)
// {
//     pthread_detach(pthread_self()); //自己主动分离

//     std::string name = reinterpret_cast<char*>(args);
//     int n = 5;
//     while(n--)
//     {
//         std::cout <<"我是new线程,name:" << name << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid,nullptr,func,(void*)"thread_1");

//     sleep(2); ////很重要，要让线程先分离，再等待!!!

//     void* retval;
//     int ret = pthread_join(tid,&retval);
//     if(ret != 0)
//     {
//         std::cout <<"wait error" << std::endl;
//         return 1;
//     }

//     std::cout <<"wait success,retval:" << retval << std::endl;
//     return 0;

//     // while(true)
//     // {
//     //     std::cout <<"我是main线程"  << std::endl;
//     //     sleep(1);
//     // }
//     // return 0;
// }

// std::string ToX(pthread_t id)
// {
//     char buffer[32];
//     snprintf(buffer, sizeof(buffer), "%#lx", id);
//     return buffer;
// }
// void *func1(void *args)
// {
//     // 1.线程return
//     std::string name = reinterpret_cast<char *>(args);
//     int n = 1;
//     while (n--)
//     {
//         // std::cout << "我是new线程,name:" << name << ",id" << ToX(pthread_self()) << std::endl;
//         sleep(1);
//     }
//     std::cout << "func1 return" << std::endl;
//     return (void *)0;
// }

// void *func2(void *args)
// {
//     // 2.调用pthread_exit()
//     std::string name = reinterpret_cast<char *>(args);
//     int n = 1;
//     while (n--)
//     {
//         // std::cout << "我是new线程,name:" << name << ",id" << ToX(pthread_self()) << std::endl;
//         sleep(1);
//     }
//     std::cout << "func2 调用pthread_exit" << std::endl;
//     pthread_exit((void *)10); // 设置返回值
// }

// void *func3(void *args)
// {
//     // 3.调用pthread_cancel()
//     std::string name = reinterpret_cast<char *>(args);
//     int n = 10;
//     while (n--)
//     {
//         // std::cout << "我是new线程,name:" << name << ",id" << ToX(pthread_self()) << std::endl;
//         std::cout << "func3 被主线程调用pthread_cancel取消" << std::endl;
//         pthread_cancel(pthread_self());
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid1, tid2, tid3;
//     int n1 = pthread_create(&tid1, nullptr, func1, (void *)"thread_1");
//     int n2 = pthread_create(&tid2, nullptr, func2, (void *)"thread_2");
//     int n3 = pthread_create(&tid3, nullptr, func3, (void *)"thread_3");
//     void *ret1 = nullptr;
//     pthread_join(tid1, &ret1);

//     void *ret2 = nullptr;
//     pthread_join(tid2, &ret2);

//     sleep(5);
//     // pthread_cancel(tid3); // 取消线程3
//     void *ret3 = nullptr;
//     pthread_join(tid3, &ret3);

//     std::cout << "ret1:" << (long long int)ret1 << std::endl; // 0
//     std::cout << "ret2:" << (long long int)ret2 << std::endl; // 10
//     std::cout << "ret3:" << (long long int)ret3 << std::endl; // -1

//     while (true)
//     {
//         // std::cout << "我是main线程,id:" << ToX(pthread_self()) << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// if(n != 0)
// {
//     std::cout <<"create thread error:" << strerror(n) << std::endl;
//     return 1;
// }